home *** CD-ROM | disk | FTP | other *** search
Text File | 1983-03-14 | 15.9 KB | 678 lines | [TEXT/CWIE] |
- // FloaterUtils
- // ©1996 Stuart Snaddon
- //
- // This unit handles stuff to do with windows and floaters in the mac interface.
- // Uses 'wind' resources to initialise and describe windows.
- //
-
- #include <Types.h>
- #include "FloaterUtils.h"
-
- // ** Structs
-
- typedef struct {
- OSType creator;
- OSType kind;
- short resID;
- char isFloating;
- char fill1;
- char isDialog;
- char fill2;
- char canMultiple;
- char fill3;
- char isResizable;
- char fill4;
- char canDock;
- char fill5;
- } WindStyle, *WindStylePtr, **WindStyleHandle;
-
- typedef struct windnode
- {
- WindowPtr window;
- WindStyle info;
- char shown;
- struct windnode *next;
- } WindNode, *WindNodePtr;
-
- WindNodePtr head = NULL;
-
- WindNodePtr GetNodeFromWindow(WindowPtr theWindow);
- WindNodePtr GetNodeFromResID(short theResID);
-
- typedef struct dockTag {
- OSType kind;
- void *func;
- struct dockTag *next;
- } DockDesc, *DockPtr, **DockHandle;
-
- DockPtr dockHead = NULL; // uh... huh huh hrm he
-
- short FWIsInDockRegion(WindowPtr theWindow, Point thePoint);
- void *FWGetDockingRoutine(OSType theDockType);
- // routine format:
- // short dockRoutine(WindowPtr floater, WindowPtr mainWindow);
- // returns true = docked successfully
- // false = didn't dock
- pascal void myDragHook(void);
-
- // ***********************************************************************************
-
- void FWAddDockingRoutine(OSType theDockType, void *theDockRoutine) {
- DockPtr temp;
-
- if (FWGetDockingRoutine(theDockType))
- return;
-
- temp = (DockPtr)NewPtr(sizeof(DockDesc));
- temp->kind = theDockType;
- temp->func = theDockRoutine;
- temp->next = dockHead;
- dockHead = temp;
- }
-
- // ***********************************************************************************
-
- void *FWGetDockingRoutine(OSType theDockType) {
- DockPtr temp = dockHead;
-
- while (temp != NULL) {
- if (temp->kind == theDockType)
- return temp->func;
- temp = temp->next;
- }
-
- return NULL;
- }
-
- // ***********************************************************************************
-
- short FWIsInDockRegion(WindowPtr theWindow, Point thePoint) {
- WindowPtr frontWin = FWFrontWindow();
- Rect theRect = frontWin->portRect;
-
- if (canDock(theWindow)) {
- if ((GetWinKind(frontWin) == GetWinCreator(theWindow))
- || ((OSType)frontWin == GetWinCreator(theWindow))) {
-
- theRect.bottom = 20;
- if (PtInRect(thePoint, &theRect))
- return true;
- }
- }
-
- return false;
- }
-
- // ***********************************************************************************
-
- WindNodePtr GetNodeFromWindow(WindowPtr theWindow)
- {
- extern WindNodePtr head;
- WindNode *p,*q;
-
- p=head;
- q=0;
- while (p!=q)
- if (p->window==theWindow) q=p;
- else p=p->next;
- return p;
- }
-
- // ***********************************************************************************
-
- WindNodePtr GetNodeFromResID(short theResID)
- {
- extern WindNodePtr head;
- WindNode *p,*q;
-
- p=head;
- q=0;
- while (p!=q)
- if (p->info.resID==theResID) q=p;
- else p=p->next;
- return p;
- }
-
- // ***********************************************************************************
-
- WindowPtr FWOpenWindow(short theResID)
- {
- extern WindNodePtr head;
- WindNode *temp;
- WindStyleHandle theRes;
- WindowPtr behindWin;
-
- theRes=(WindStyleHandle)GetResource('wind',theResID);
- HLock((Handle)theRes);
- if (((*theRes)->canMultiple!=0) || (GetNodeFromResID((*theRes)->resID)==0)) {
- temp=(WindNodePtr)NewPtrClear(sizeof(WindNode));
- if ((temp!=0) && (theRes!=0)) {
- BlockMove(*theRes,&(temp->info),sizeof(WindStyle));
- temp->shown=true;
- temp->next=head;
- head=temp;
- if (temp->info.isFloating) {
- behindWin=(WindowPtr)-1;
- } else {
- behindWin=FWLastFloater();
- if (FWFrontWindow() != 0)
- HiliteWindow(FWFrontWindow(),false);
- }
- if (behindWin==nil)
- behindWin=(WindowPtr)-1;
- if (temp->info.isDialog) {
- temp->window=GetNewDialog(temp->info.resID,0,behindWin);
- } else {
- temp->window=GetNewCWindow(temp->info.resID,0,behindWin);}
- if (FWFrontWindow() != 0) {
- HiliteWindow(FWFrontWindow(),true);}
- UpdateFloaters();
- HUnlock((Handle)theRes);
- return (temp->window);
- }
- } else {
- FWSelectWindow((GetNodeFromResID((*theRes)->resID))->window);
- HUnlock((Handle)theRes);
- return (GetNodeFromResID((*theRes)->resID)->window);
- }
- return noErr;
- }
-
- // ***********************************************************************************
-
- void FWCloseWindow(WindowPtr theWindow)
- {
- extern WindNodePtr head;
- WindNode *p,*q,*p0;
-
- if (theWindow != 0) {
- p0=head;
- p=0;
- q=0;
- while (p0!=q) {
- if (p0->window==theWindow) {
- q=p0;
- } else {
- p=p0;
- p0=p0->next;
- }
- }
- if ((p0!=0) && (p0==q)) {
- if (isDialog(theWindow)) {
- DisposDialog(theWindow);
- } else {
- DisposeWindow(theWindow);}
- if (p==0) {
- head=p0->next;
- } else {
- p->next=p0->next;}
- DisposePtr((Ptr)p0);
- if (FWFrontWindow() != 0)
- HiliteWindow(FWFrontWindow(),true);
- UpdateFloaters();
- }
- }
- }
-
- // ***********************************************************************************
- WindowPtr g_hookWindow;
- short g_successful = false;
- RgnHandle g_dragRgn;
- PenState g_pen;
-
- pascal void myDragHook(void) {
- GrafPtr savePort;
- static Point localPt;
- short (*func)(WindowPtr floatWin, WindowPtr mainWin);
- RgnHandle localRgn = NewRgn();
-
- CopyRgn(g_dragRgn, localRgn);
-
- GetPort(&savePort);
- SetPort(FWFrontWindow());
- GetMouse(&localPt);
- SetPort(savePort);
- GetPenState(&g_pen);
-
- if (FWIsInDockRegion(g_hookWindow, localPt)) {
-
- FrameRgn(localRgn);
-
- func = FWGetDockingRoutine(GetWinKind(g_hookWindow));
-
- if (func)
- g_successful = func(g_hookWindow, FWFrontWindow());
-
- SetPort(savePort);
- SetPenState(&g_pen);
- FrameRgn(localRgn);
- }
- }
-
- void FWDragWindow(WindowPtr theWindow, Point startPt, Rect *bounds)
- {
- GrafPtr screenPort,savePort;
- RgnHandle theRgn;
- Point globDist,dist;
- long result, oldDragHook;
-
- GetPort(&savePort);
- theRgn=NewRgn();
- CopyRgn(((WindowPeek)theWindow)->strucRgn,theRgn);
- screenPort=(GrafPtr)NewPtr(sizeof(GrafPort));
- OpenPort(screenPort);
- SetPort(screenPort);
- SetPt(&globDist,(*((WindowPeek)theWindow)->contRgn)->rgnBBox.left,(*((WindowPeek)theWindow)->contRgn)->rgnBBox.top);
-
- oldDragHook = *((long *)0x09F6);
- *((long *)0x09F6) = (long)myDragHook;
- g_hookWindow = theWindow;
- g_successful = false;
- g_dragRgn = theRgn;
-
- result=DragGrayRgn(theRgn,startPt,bounds,bounds,0,0);
-
- *((long *)0x09F6) = oldDragHook;
-
- dist.v=HiWord(result);
- dist.h=LoWord(result);
- ClosePort(screenPort);
- DisposePtr((Ptr)screenPort);
- SetPort(savePort);
- if (g_successful) // managed to dock fine, so trash this window
- FWCloseWindow(theWindow);
- else {
- if (result != 0x80008000) {
- SetPt(&globDist,globDist.h+dist.h,globDist.v+dist.v);
- MoveWindow(theWindow,globDist.h,globDist.v,false);}
- FWSelectWindow(theWindow);}
- }
-
- // ***********************************************************************************
-
- void FWSelectWindow(WindowPtr theWindow)
- {
- WindowPtr behindWin,foreWindow;
-
- foreWindow=FWFrontWindow();
- if (theWindow!=0) {
- if ((isFloating(theWindow)) && (FWFrontFloater()!=theWindow)) {
- HiliteWindow(FWFrontFloater(),false);
- BringToFront(theWindow);
- HiliteWindow(theWindow,true);
- }
- else if ((!isFloating(theWindow))&&(foreWindow!=theWindow)) {
- HiliteWindow(foreWindow,false);
- behindWin=FWLastFloater();
- if (behindWin==0) {
- BringToFront(theWindow);
- } else {
- SendBehind(theWindow,behindWin);}
- HiliteWindow(theWindow,true);
- UpdateFloaters();
- }}
- }
-
- // ***********************************************************************************
-
- WindowPtr FWLastFloater(void)
- {
- WindowPtr theWindow,endWindow;
-
- theWindow = FrontWindow();
- endWindow = nil;
- while (theWindow != nil) {
- if (isFloating(theWindow) && isVisible(theWindow))
- endWindow = theWindow;
- theWindow = (WindowPtr)(((WindowPeek)theWindow)->nextWindow);}
- return endWindow;
- }
-
- // ***********************************************************************************
-
- WindowPtr FWFrontFloater(void)
- {
- WindowPtr theWindow;
-
- theWindow=FrontWindow();
- if (isFloating(theWindow)) {
- return theWindow;}
- else {
- return nil;}
- }
-
- // ***********************************************************************************
-
- WindowPtr FWFrontWindow(void)
- {
- WindowPtr theWindow;
-
- theWindow=FrontWindow();
- while ((theWindow!=0) && (isFloating(theWindow)))
- theWindow=(WindowPtr)(((WindowPeek)theWindow)->nextWindow);
- return theWindow;
- }
-
- // ***********************************************************************************
-
- char isFloating(WindowPtr theWindow)
- {
- if (theWindow!=0) {
- return (GetNodeFromWindow(theWindow)->info.isFloating);
- } else {
- return 0;}
- }
-
- // ***********************************************************************************
-
- char isResizable(WindowPtr theWindow)
- {
- if (theWindow!=0) {
- return (GetNodeFromWindow(theWindow)->info.isResizable);
- } else {
- return 0;}
- }
-
- // ***********************************************************************************
-
- char isDialog(WindowPtr theWindow)
- {
- if (theWindow!=0) {
- return (((WindowPeek)theWindow)->windowKind==dialogKind);
- } else {
- return 0;}
- }
-
- // ***********************************************************************************
-
- char isVisible(WindowPtr theWindow)
- {
- if (theWindow!=0) {
- return (GetNodeFromWindow(theWindow)->shown);
- } else {
- return false;}
- }
-
- // ***********************************************************************************
-
- char canMultiple(WindowPtr theWindow)
- {
- return (GetNodeFromWindow(theWindow)->info.canMultiple);
- }
-
- // ***********************************************************************************
-
- char canDock(WindowPtr theWindow)
- {
- return (GetNodeFromWindow(theWindow)->info.canDock);
- }
-
- // ***********************************************************************************
-
- OSType GetWinCreator(WindowPtr theWindow)
- {
- return (GetNodeFromWindow(theWindow)->info.creator);
- }
-
- // ***********************************************************************************
-
- OSType GetWinKind(WindowPtr theWindow)
- {
- return (GetNodeFromWindow(theWindow)->info.kind);
- }
-
- // ***********************************************************************************
-
- void SetWinCreator(WindowPtr theWindow, OSType newCreator)
- {
- (GetNodeFromWindow(theWindow)->info.creator)=newCreator;
- }
-
- // ***********************************************************************************
-
- void SetWinKind(WindowPtr theWindow, OSType newKind)
- {
- (GetNodeFromWindow(theWindow)->info.kind)=newKind;
- }
-
- // ***********************************************************************************
-
- void SetCanMultiple(WindowPtr theWindow, char canMultiple)
- {
- (GetNodeFromWindow(theWindow)->info.canMultiple)=canMultiple;
- }
-
- // ***********************************************************************************
-
- void SetCanDock(WindowPtr theWindow, char canDock)
- {
- (GetNodeFromWindow(theWindow)->info.canDock)=canDock;
- }
-
- // ***********************************************************************************
-
- void SetFloating(WindowPtr theWindow, char isFloating)
- {
- GetNodeFromWindow(theWindow)->info.isFloating=isFloating;
- FWSelectWindow(theWindow);
- }
-
- // ***********************************************************************************
-
- void SetResizable(WindowPtr theWindow, char isResizable)
- {
- GetNodeFromWindow(theWindow)->info.isResizable=isResizable;
- }
-
- // ***********************************************************************************
-
- void SuspendWindows(char suspended)
- {
- WindowPtr foreWindow;
-
- if ((foreWindow=FWFrontWindow()) == nil) return;
-
- if (suspended)
- HideAllFloaters();
- else
- UpdateFloaters();
- if (foreWindow!=0)
- HiliteWindow(foreWindow,!suspended);
- }
-
- // ***********************************************************************************
-
- void UpdateFloaters(void)
- {
- extern WindNodePtr head;
- WindowPtr foreWindow;
- WindNode *p;
-
- foreWindow=FWFrontWindow();
- p=head;
- while (p!=0) {
- if (isFloating(p->window) && (p->info.creator=='appl')) {
- ShowFloater(p->window);
- } else if (isFloating(p->window) && (p->info.creator==GetNodeFromWindow(foreWindow)->info.kind)) {
- ShowFloater(p->window);
- } else if (isFloating(p->window) && (p->info.creator==(OSType)foreWindow)) {
- ShowFloater(p->window);
- } else if (isFloating(p->window)) {
- HideFloater(p->window);}
- p=p->next;
- }
- }
-
- // ***********************************************************************************
-
- void HideFloater(WindowPtr theWindow)
- {
- WindNode *node;
- Point globDist;
-
- node=GetNodeFromWindow(theWindow);
- SetPt(&globDist,(*((WindowPeek)theWindow)->contRgn)->rgnBBox.left,(*((WindowPeek)theWindow)->contRgn)->rgnBBox.top);
- if ((node->shown) && (globDist.h != 0) && (globDist.v != 0)) {
- node->shown=false;
- MoveWindow(theWindow,globDist.h+5000,globDist.v+5000,false);
- SendBehind(theWindow,0);
- }
- }
-
- // ***********************************************************************************
-
- void HideAllFloaters(void)
- {
- extern WindNodePtr head;
- WindNode *p;
-
- p=head;
- while (p!=0) {
- if (isFloating(p->window))
- HideFloater(p->window);
- p=p->next;
- }
- }
-
- // ***********************************************************************************
-
- void ShowFloater(WindowPtr theWindow)
- {
- WindNode *node;
- Point globDist;
-
- node=GetNodeFromWindow(theWindow);
- SetPt(&globDist,(*((WindowPeek)theWindow)->contRgn)->rgnBBox.left,(*((WindowPeek)theWindow)->contRgn)->rgnBBox.top);
- if (!(node->shown)) {
- node->shown=true;
- MoveWindow(theWindow,globDist.h-5000,globDist.v-5000,false);
- BringToFront(theWindow);
- }
- }
-
- // ***********************************************************************************
-
- void ShowCertainFloaters(OSType theCreator)
- {
- extern WindNodePtr head;
- WindNode *p;
-
- p=head;
- while (p!=0) {
- if ((isFloating(p->window)) && (p->info.creator==theCreator))
- ShowFloater(p->window);
- p=p->next;
- }
- }
-
- // ***********************************************************************************
-
- char ExistsAllready(OSType theKind)
- {
- extern WindNodePtr head;
- WindNode *p,*q;
-
- p=head;
- q=0;
- while (p!=q) {
- if (p->info.kind==theKind){
- q=p;
- } else {
- p=p->next;}
- }
- return (char)(p!=0);
- }
-
- // ***********************************************************************************
-
- WindowPtr GetWindowWithKind(OSType theKind)
- {
- extern WindNodePtr head;
- WindNode *p,*q;
-
- p=head;
- q=0;
- while (p!=q) {
- if (p->info.kind==theKind) {
- q=p;
- } else {
- p=p->next;}
- }
- if (p!=0) {
- return (p->window);}
- else {
- return nil;}
- }
-
- // ***********************************************************************************
-
- char ExistsWindowWithTitle(Str255 theTitle)
- {
- extern WindNodePtr head;
- WindNode *p,*q;
- Str255 realTitle;
-
- p=head;
- q=0;
- while (p!=q) {
- GetWTitle(p->window,realTitle);
- if (EqualString(realTitle,theTitle,false,false)) {
- q=p;
- } else {
- p=p->next;}
- }
- return (char)(p!=0);
- }
-
- // ***********************************************************************************
-
- WindowPtr GetWindowWithTitle(Str255 theTitle)
- {
- extern WindNodePtr head;
- WindNode *p,*q;
- Str255 realTitle;
-
- p=head;
- q=0;
- while (p!=q) {
- GetWTitle(p->window,realTitle);
- if (EqualString(realTitle,theTitle,false,false)) {
- q=p;
- } else {
- p=p->next;}
- }
- if (p!=0) {
- return (p->window);}
- else {
- return nil;}
- }
-
- // ***********************************************************************************
-
- char FWDialogSelect(EventRecord *theEvent, WindowPtr *theWindow, short *itemHit)
- {
- Point localPt;
- short iType;
- Handle iHandle;
- Rect iRect;
-
- if (((WindowPeek)theWindow)->windowKind==dialogKind)
- if (FindWindow(theEvent->where,theWindow)==inContent) {
- localPt=theEvent->where;
- SetPort(*theWindow);
- GlobalToLocal(&localPt);
- *itemHit=FindDItem(*theWindow,localPt)+1;
- if (*itemHit>0) {
- GetDItem(*theWindow,*itemHit,&iType,&iHandle,&iRect);
- if ((iType<8) && (iType>3)) {
- if (FindControl(localPt,*theWindow,&(ControlHandle)iHandle)!=0)
- return (char)(TrackControl((ControlHandle)iHandle,localPt,nil)!=0);
- } else {
- return (char)true;
- }
- }
- }
- return false;
- }
-
- // ***********************************************************************************